/**
 * 
 */
package br.com.ctm.guiamedico.bean;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.model.SortOrder;

import br.com.ctm.guiamedico.dao.api.VersaoDao;
import br.com.ctm.guiamedico.model.Medico;
import br.com.ctm.guiamedico.model.Versao;
import br.com.ctm.guiamedico.negocio.api.MedicoNegocio;
import br.com.ctm.guiamedico.negocio.api.VersaoNegocio;
import br.com.framework.apresentacao.bean.CRUDBean;
import br.com.framework.apresentacao.datamodel.LazyEntityDataModel;

/**
 * @author Cleber
 *
 */
@Named
@ConversationScoped
public class VersaoBean extends CRUDBean<Versao, VersaoDao, VersaoNegocio>{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private List<Medico> medicosIncluidos = new ArrayList<Medico>();
	private LazyEntityDataModel<Medico> medicosIncluidosDataModel;
	
	private List<Medico> medicosRemovidos = new ArrayList<Medico>();
	private LazyEntityDataModel<Medico> medicosRemovidosDataModel;
	
	@Inject
	private MedicoNegocio medicoNegocio;
	
	/**
	 * @param entidadeClass
	 */
	public VersaoBean() {
		super(Versao.class);
	}

	@Inject
	protected void setNegocio(VersaoNegocio negocio) {
		super.setNegocio(negocio);
	}
	
	@SuppressWarnings("serial")
	@Override
	protected void beforeOutcomeEdit() {
		medicosIncluidosDataModel = new LazyEntityDataModel<Medico>(medicosIncluidos) {
			@Override
			public List<Medico> load(int first, int pageSize, String sortField,
					SortOrder sortOrder, Map<String, String> filters) {
				medicosIncluidos.clear();
	            try {
	            	setRowCount(medicoNegocio.getCountMedicosIncluidosNaVersao(getEntidade().getNumero()).intValue());
	            	medicosIncluidos.addAll(medicoNegocio.getMedicosIncluidosNaVersao(getEntidade().getNumero(), first, pageSize));
	            } catch (Exception e) {
	            	getFacesMessages().addMessageError("medicosIncluidosDataModel", "dataModel.erro.carregando", 
	            			getEntidadeClassName());
	                LOGGER.error("Falha carregando registros", e);
	            }
	            return medicosIncluidos;
			}
		};
		medicosIncluidosDataModel.setPageSize(getPageSize());
		
		medicosRemovidosDataModel = new LazyEntityDataModel<Medico>(medicosRemovidos) {
			@Override
			public List<Medico> load(int first, int pageSize, String sortField,
					SortOrder sortOrder, Map<String, String> filters) {
				medicosRemovidos.clear();
	            try {
	            	setRowCount(medicoNegocio.getCountMedicosRemovidosNaVersao(getEntidade().getNumero()).intValue());
	            	medicosRemovidos.addAll(medicoNegocio.getMedicosRemovidosNaVersao(getEntidade().getNumero(), first, pageSize));
	            } catch (Exception e) {
	            	getFacesMessages().addMessageError("medicosRemovidosDataModel", "dataModel.erro.carregando", 
	            			getEntidadeClassName());
	                LOGGER.error("Falha carregando registros", e);
	            }
	            return medicosRemovidos;
			}
		};
		medicosRemovidosDataModel.setPageSize(getPageSize());
	}

	/**
	 * @return the medicosIncluidosDataModel
	 */
	public LazyEntityDataModel<Medico> getMedicosIncluidosDataModel() {
		return medicosIncluidosDataModel;
	}

	/**
	 * @param medicosIncluidosDataModel the medicosIncluidosDataModel to set
	 */
	public void setMedicosIncluidosDataModel(
			LazyEntityDataModel<Medico> medicosIncluidosDataModel) {
		this.medicosIncluidosDataModel = medicosIncluidosDataModel;
	}

	/**
	 * @return the medicosRemovidosDataModel
	 */
	public LazyEntityDataModel<Medico> getMedicosRemovidosDataModel() {
		return medicosRemovidosDataModel;
	}

	/**
	 * @param medicosRemovidosDataModel the medicosRemovidosDataModel to set
	 */
	public void setMedicosRemovidosDataModel(
			LazyEntityDataModel<Medico> medicosRemovidosDataModel) {
		this.medicosRemovidosDataModel = medicosRemovidosDataModel;
	}

	/**
	 * @return the medicosIncluidos
	 */
	public List<Medico> getMedicosIncluidos() {
		return medicosIncluidos;
	}

	/**
	 * @param medicosIncluidos the medicosIncluidos to set
	 */
	public void setMedicosIncluidos(List<Medico> medicosIncluidos) {
		this.medicosIncluidos = medicosIncluidos;
	}

	/**
	 * @return the medicosRemovidos
	 */
	public List<Medico> getMedicosRemovidos() {
		return medicosRemovidos;
	}

	/**
	 * @param medicosRemovidos the medicosRemovidos to set
	 */
	public void setMedicosRemovidos(List<Medico> medicosRemovidos) {
		this.medicosRemovidos = medicosRemovidos;
	}

}
